package net.servir.capacidades.dao.jdbc;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import net.servir.capacidades.dao.MantenimientoDAO;
import net.servir.capacidades.model.Ambito;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.GrupoCalificacion;
import net.servir.capacidades.model.Persona;
import net.servir.capacidades.model.PreguntaServicio;
import net.servir.capacidades.model.PreguntaTipo;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.RptResponsableBusqueda;
import net.servir.capacidades.model.SectorPregunta;
import net.servir.capacidades.model.SegPerfil;
import net.servir.capacidades.model.SegPerfilPermiso;
import net.servir.capacidades.model.SegPermiso;
import net.servir.capacidades.model.SegRecurso;
import net.servir.capacidades.model.Enumerados.GrupoDatosMaestro;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.Restriccion;
import net.servir.capacidades.model.Wserror;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class JdbcMantenimientoDAO implements MantenimientoDAO {

	private SimpleJdbcTemplate jdbcTemplate;
	private DataSource dataSource;
	
	@Autowired
	private JdbcCapacidadesDAO jdbcCapacidadesDao;
	
	@Autowired
	public JdbcMantenimientoDAO(DataSource dataSource){
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
		this.dataSource = dataSource;
	}

	public PuestoTipo getPuestoTipo(Number idPuestoTipo) {

		PuestoTipo obj = null;

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_PUESTO_TIPO,ID_SISTEMA,PUESTO_TIPO,ESTADO,USUARIO_ACT,to_char(FEC_ACT,'DD/MM/YYYY') as FEC_ACT,COD_GRUPO");
		sql.append(" FROM PUESTO_TIPO WHERE ID_PUESTO_TIPO = ? ");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idPuestoTipo);
		for(Map<String, Object> rec : collec){
			obj = new PuestoTipo();
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));
			obj.setPuesto_tipo((String)rec.get("PUESTO_TIPO"));
			obj.setEstado((String)rec.get("ESTADO"));
			obj.setUsuario_act((String)rec.get("USUARIO_ACT"));
			obj.setFec_act((String)rec.get("FEC_ACT"));
			obj.setCod_grupo((String)rec.get("COD_GRUPO"));

		}
		return obj;

	}
	
	public List<PuestoTipo> getPuestoTipos(Number idSistema) {

		List<PuestoTipo> list = new LinkedList<PuestoTipo>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_PUESTO_TIPO,ID_SISTEMA,PUESTO_TIPO,NEMOTECNICO,ESTADO,USUARIO_ACT,to_char(FEC_ACT,'DD/MM/YYYY') as FEC_ACT,COD_GRUPO, nvl(ES_RESPONSABLE, '0') as ES_RESPONSABLE ");
		sql.append(" FROM PUESTO_TIPO WHERE ID_SISTEMA = ? ORDER BY PUESTO_TIPO");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			PuestoTipo obj = new PuestoTipo();
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));
			obj.setPuesto_tipo((String)rec.get("PUESTO_TIPO"));
			obj.setEstado((String)rec.get("ESTADO"));
			obj.setUsuario_act((String)rec.get("USUARIO_ACT"));
			obj.setFec_act((String)rec.get("FEC_ACT"));
			obj.setCod_grupo((String)rec.get("COD_GRUPO"));
			obj.setEs_responsable((String)rec.get("ES_RESPONSABLE"));
			obj.setNemotecnico((String)rec.get("NEMOTECNICO"));
			list.add(obj);
		}
		return list;

	}
	
	public List<PuestoTipo> getPuestoTiposOperadores(Number idSistema) {

		List<PuestoTipo> list = new LinkedList<PuestoTipo>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_PUESTO_TIPO,ID_SISTEMA,PUESTO_TIPO,NEMOTECNICO,ESTADO,USUARIO_ACT,to_char(FEC_ACT,'DD/MM/YYYY') as FEC_ACT,COD_GRUPO, nvl(ES_RESPONSABLE, '0') as ES_RESPONSABLE ");
		sql.append(" FROM PUESTO_TIPO WHERE ID_SISTEMA = ? ORDER BY PUESTO_TIPO");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			PuestoTipo obj = new PuestoTipo();
			obj.setId_puesto_tipo((Number)rec.get("ID_PUESTO_TIPO"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));
			obj.setPuesto_tipo((String)rec.get("PUESTO_TIPO"));
			obj.setEstado((String)rec.get("ESTADO"));
			obj.setUsuario_act((String)rec.get("USUARIO_ACT"));
			obj.setFec_act((String)rec.get("FEC_ACT"));
			obj.setCod_grupo((String)rec.get("COD_GRUPO"));
			obj.setEs_responsable((String)rec.get("ES_RESPONSABLE"));
			obj.setNemotecnico((String)rec.get("NEMOTECNICO"));
			list.add(obj);
		}
		PuestoTipo obj = new PuestoTipo();
		obj.setId_puesto_tipo(98);
		obj.setPuesto_tipo("RESPONSABLE DEL CENSO");
		list.add(obj);
		
		return list;

	}	
	
	
	public List<FuncionLeyenda> getFuncionesPorSistema(Number idSistema, GrupoDatosMaestro nivel)
	{
		List<FuncionLeyenda> list = new LinkedList<FuncionLeyenda>();

		StringBuilder sql = new StringBuilder();
		if (nivel == GrupoDatosMaestro.PARA_ALGORITMO)
		{
			sql.append("SELECT 1 as prioridad,99 as ID_FUNCION,null ID_ETAPA,'<Funciones Participante>' DESCRIPCION,'Función Asignada' NEMOTECNICO from dual UNION ALL ");
			sql.append(" SELECT 2 as prioridad,0 as ID_FUNCION,null ID_ETAPA,'<Todas las Funciones>' DESCRIPCION,'Todas' NEMOTECNICO from dual UNION ALL ");
		}
		sql.append(" SELECT 3 as prioridad,ID_FUNCION,ID_ETAPA,DESCRIPCION,NEMOTECNICO");
		sql.append(" FROM FUNCION");
		sql.append(" WHERE id_etapa in (select id_etapa from etapa e join ambito a on e.id_ambito = a.id_ambito and a.id_sistema = ?)");
		sql.append(" Order by prioridad,nemotecnico");
		

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			FuncionLeyenda obj = new FuncionLeyenda();
			obj.setId_funcion((Number)rec.get("ID_FUNCION"));
			obj.setId_etapa((Number)rec.get("ID_ETAPA"));
			obj.setDescripcion((String)rec.get("DESCRIPCION"));
			obj.setNemotecnico((String)rec.get("NEMOTECNICO"));

			list.add(obj);
		}
		return list;
		
	}	

	public List<SectorPregunta> getSectoresPregunta(GrupoDatosMaestro nivel)
	{
		List<SectorPregunta> list = new LinkedList<SectorPregunta>();

		StringBuilder sql = new StringBuilder();
		if (nivel == GrupoDatosMaestro.PARA_ALGORITMO)
		{
			sql.append("SELECT 1 as prioridad,99 as ID_SECTOR_PREGUNTA,'(Sector del Participante)' SECTOR_PREGUNTA FROM dual UNION ALL ");
			sql.append(" SELECT 2 as prioridad,0 as ID_SECTOR_PREGUNTA,'(Todos los Sectores)' SECTOR_PREGUNTA FROM dual UNION ALL ");
		}		
		sql.append(" SELECT 3 as prioridad,ID_SECTOR_PREGUNTA,SECTOR_PREGUNTA");
		sql.append(" FROM SECTOR_PREGUNTA WHERE ID_SECTOR_PREGUNTA <> 0");
		sql.append(" ORDER BY prioridad,sector_pregunta");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString());
		for(Map<String, Object> rec : collec){
			SectorPregunta obj = new SectorPregunta();
			obj.setId_sector_pregunta((Number)rec.get("ID_SECTOR_PREGUNTA"));
			obj.setSector_pregunta((String)rec.get("SECTOR_PREGUNTA"));

			list.add(obj);
		}
		return list;
		
	}
	
	public List<GrupoCalificacion> getGruposCalificacionPorSistema(Number idSistema)
	{
		List<GrupoCalificacion> list = new LinkedList<GrupoCalificacion>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_GRUPO_CALIFICA,ID_AMBITO,GRUPO_CALIFICACION");
		sql.append(" FROM GRUPO_CALIFICACION");
		sql.append(" WHERE ID_AMBITO in (SELECT ID_AMBITO FROM AMBITO WHERE ID_SISTEMA = ?)");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			GrupoCalificacion obj = new GrupoCalificacion();
			obj.setId_grupo_califica((Number)rec.get("ID_GRUPO_CALIFICA"));
			obj.setId_ambito((Number)rec.get("ID_AMBITO"));
			obj.setGrupo_calificacion((String)rec.get("GRUPO_CALIFICACION"));

			list.add(obj);
		}
		return list;
		
	}
	
	public List<GrupoCalificacion> getGruposCalificacionNemotecnicoPorSistema(Number idSistema)
	{
		List<GrupoCalificacion> list = new LinkedList<GrupoCalificacion>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_GRUPO_CALIFICA,ID_AMBITO,GRUPO_CALIFICACION || '(' || NEMOTECNICO || ')' as GRUPO_CALIFICACION ");
		sql.append(" FROM GRUPO_CALIFICACION");
		sql.append(" WHERE ID_AMBITO in (SELECT ID_AMBITO FROM AMBITO WHERE ID_SISTEMA = ?)");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			GrupoCalificacion obj = new GrupoCalificacion();
			obj.setId_grupo_califica((Number)rec.get("ID_GRUPO_CALIFICA"));
			obj.setId_ambito((Number)rec.get("ID_AMBITO"));
			obj.setGrupo_calificacion((String)rec.get("GRUPO_CALIFICACION"));

			list.add(obj);
		}
		return list;
		
	}
	
	
	public List<PreguntaServicio> getPreguntasServicio(Number idSistema)
	{
		List<PreguntaServicio> list = new LinkedList<PreguntaServicio>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_PREGUNTA_SERVICIO,PREGUNTA_SERVICIO,ID_SISTEMA");
		sql.append(" FROM PREGUNTA_SERVICIO WHERE ID_SISTEMA = ?");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			PreguntaServicio obj = new PreguntaServicio();
			obj.setId_pregunta_servicio((Number)rec.get("ID_PREGUNTA_SERVICIO"));
			obj.setPregunta_servicio((String)rec.get("PREGUNTA_SERVICIO"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));

			list.add(obj);
		}
		return list;
	}
	public List<PreguntaTipo> getPreguntaTipos(Number idSistema)
	{
		List<PreguntaTipo> list = new LinkedList<PreguntaTipo>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT ID_PREGUNTA_TIPO,ID_SISTEMA,PREGUNTA_TIPO,USUARIO_ACT,to_char(FEC_ACT,'DD/MM/YYYY') as FEC_ACT");
		sql.append(" FROM PREGUNTA_TIPO WHERE ID_SISTEMA = ? ORDER BY PREGUNTA_TIPO");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idSistema);
		for(Map<String, Object> rec : collec){
			PreguntaTipo obj = new PreguntaTipo();
			obj.setId_pregunta_tipo((Number)rec.get("ID_PREGUNTA_TIPO"));
			obj.setId_sistema((Number)rec.get("ID_SISTEMA"));
			obj.setPregunta_tipo((String)rec.get("PREGUNTA_TIPO"));
			obj.setUsuario_act((String)rec.get("USUARIO_ACT"));
			obj.setFec_act((String)rec.get("FEC_ACT"));

			list.add(obj);
		}
		return list;		
	}
	
	public LinkedList<SegRecurso> getSegRecursos(Integer idPerfil)
	{
		LinkedList<SegRecurso> list = new LinkedList<SegRecurso>();

		StringBuilder sql = new StringBuilder();
		sql.append(" select ID_RECURSO, RECURSO, TIPO, ORDEN, HREF, TARGET, CAPTION from seg_recurso ");
		//sql.append(" where id_recurso not in  (select distinct(sp.id_recurso) as  id_recurso ");
		//sql.append(" from  seg_perfil_permiso spp, seg_recurso sr, seg_permiso sp ");
		//sql.append(" where spp.id_permiso = sp.id_permiso and sr.id_recurso = sp.id_recurso ");
		//sql.append(" and id_perfil = ? ");
		//sql.append(" group by sp.id_recurso)");
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString());
		for(Map<String, Object> rec : collec){
			SegRecurso obj = new SegRecurso();
			obj.setId_recurso((Number)rec.get("ID_RECURSO"));
			obj.setRecurso((String)rec.get("RECURSO"));
			obj.setTipo((String)rec.get("TIPO"));
			obj.setOrden((String)rec.get("ORDEN"));
			obj.setHref((String)rec.get("HREF"));
			obj.setTarget((String)rec.get("TARGET"));
			obj.setCaption((String)rec.get("CAPTION"));
			list.add(obj);
		}
		return list;		
	}
	
	public LinkedList<SegPermiso> getSegPermisos(Integer idRecurso, Integer idPerfil)
	{
		LinkedList<SegPermiso> list = new LinkedList<SegPermiso>();

		StringBuilder sql = new StringBuilder();
		sql.append(" select id_permiso, permiso from seg_permiso where id_recurso = ? ");
		sql.append(" and id_permiso not in (select id_permiso from seg_perfil_permiso where id_perfil = ? )");
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idRecurso, idPerfil);
		for(Map<String, Object> rec : collec){
			SegPermiso obj = new SegPermiso();
			obj.setId_permiso((Number)rec.get("ID_PERMISO"));
			obj.setPermiso((String)rec.get("PERMISO"));
			list.add(obj);
		}
		return list;		
	}
	
	public LinkedList<SegPerfilPermiso> getSegPerfilPermiso(Integer idPerfil)
	{
		LinkedList<SegPerfilPermiso> list = new LinkedList<SegPerfilPermiso>();

		StringBuilder sql = new StringBuilder();
		sql.append(" select spp.id_permiso, spp.id_perfil, sr.recurso, sp.permiso from  ");
		sql.append(" seg_perfil_permiso spp, seg_recurso sr, seg_permiso sp ");
		sql.append(" where spp.id_permiso = sp.id_permiso and sr.id_recurso = sp.id_recurso ");
		sql.append("and id_perfil = ? order by sr.recurso, sp.permiso ");
		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString(),idPerfil);
		for(Map<String, Object> rec : collec){
			SegPerfilPermiso obj = new SegPerfilPermiso();
			obj.setId_permiso((Number)rec.get("ID_PERMISO"));
			obj.setId_perfil((Number)rec.get("ID_PERFIL"));
			obj.setRecurso((String)rec.get("RECURSO"));
			obj.setPermiso((String)rec.get("PERMISO"));
			list.add(obj);
		}
		return list;		
	}
	
	public String esJefePuestoTipo(Number idPuestoTipo)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("select nvl(max(case cod_grupo when 'J' then '1' else '0' end),'0') as Jefe from puesto_tipo where id_puesto_tipo = ?");
		return jdbcTemplate.queryForObject(sql.toString(), String.class, idPuestoTipo);
	}
	
	public String grabarProfesion(Profesion profesion)
	{
		StringBuilder sql = new StringBuilder();
		String codGeneral = null;
		if (profesion.getCod_profesion() == null)
		{			 
			codGeneral = this.jdbcTemplate.queryForObject("SELECT to_char(SEQ_COD_GENERAL.NEXTVAL, '0000') FROM DUAL ", String.class);
			sql = new StringBuilder();
			sql.append("INSERT INTO CODIGO (CODIGO, descripcion, GRUPO, ESTADO) ");
			sql.append(" VALUES (?,?,?,?)");			
			this.jdbcTemplate.update(sql.toString(),codGeneral.trim(),profesion.getDesc_profesion(), "PROF","1");			
		}
		else
		{
			codGeneral = profesion.getCod_profesion();
			
			sql = new StringBuilder();
			sql.append("UPDATE CODIGO SET DESCRIPCION =? ");
			sql.append(" WHERE CODIGO = ? AND GRUPO = 'PROF'");			
			
			this.jdbcTemplate.update(sql.toString(),profesion.getDesc_profesion(),codGeneral);			
			
		}
		return codGeneral;
		
	}

	public Integer grabarGrupoCalificacion(GrupoCalificacion grupoCalificacion)
	{
		StringBuilder sql = new StringBuilder();
		Integer id = null;
		if (grupoCalificacion.getId_grupo_califica() == null)
		{			 
			id = this.jdbcTemplate.queryForInt("select (max(id_grupo_califica) + 1 ) as id_grupo_califica from grupo_calificacion ");
			sql = new StringBuilder();
			sql.append("INSERT INTO GRUPO_CALIFICACION (ID_GRUPO_CALIFICA, ID_AMBITO, GRUPO_CALIFICACION, NEMOTECNICO ) ");
			sql.append(" VALUES (?,?,?,?)");			
			this.jdbcTemplate.update(sql.toString(),id,grupoCalificacion.getId_ambito(), grupoCalificacion.getGrupo_calificacion(), grupoCalificacion.getNemotecnico());			
		}
		else
		{
			id = grupoCalificacion.getId_grupo_califica().intValue();
			sql = new StringBuilder();
			sql.append("UPDATE GRUPO_CALIFICACION SET GRUPO_CALIFICACION =?, NEMOTECNICO = ?, ID_AMBITO = ? ");
			sql.append(" WHERE ID_GRUPO_CALIFICA = ? ");			
			
			this.jdbcTemplate.update(sql.toString(),grupoCalificacion.getGrupo_calificacion(),grupoCalificacion.getNemotecnico(), grupoCalificacion.getId_ambito(), id);			
			
		}
		return id;
		
	}

	public String grabarRegimen(Regimen regimen)
	{
		StringBuilder sql = new StringBuilder();
		String codGeneral = null;
		if (regimen.getCod_regimen() == null)
		{			 
			codGeneral = this.jdbcTemplate.queryForObject("SELECT to_char(SEQ_COD_GENERAL.NEXTVAL, '0000') FROM DUAL ", String.class);
			sql = new StringBuilder();
			sql.append("INSERT INTO CODIGO (CODIGO, descripcion, GRUPO, ESTADO) ");
			sql.append(" VALUES (?,?,?,?)");			
			this.jdbcTemplate.update(sql.toString(),codGeneral.trim(),regimen.getDesc_regimen(), "REGI","1");			
		}
		else
		{
			codGeneral = regimen.getCod_regimen();
			sql = new StringBuilder();
			sql.append("UPDATE CODIGO SET DESCRIPCION =? ");
			sql.append(" WHERE CODIGO = ? AND GRUPO = 'REGI'");			
			
			this.jdbcTemplate.update(sql.toString(),regimen.getDesc_regimen(),codGeneral);			
			
		}
		return codGeneral;
		
	}
	
	public Integer grabarSegPerfil(SegPerfil segPerfil)
	{
		StringBuilder sql = new StringBuilder();
		Integer id = null;
		if (segPerfil.getId_perfil().intValue() == 0)
		{			
			//select id_perfil, perfil from seg_perfil;
			id = this.jdbcTemplate.queryForInt("select (max(id_perfil) + 1 ) as id_perfil from seg_perfil ");
			sql = new StringBuilder();
			sql.append("INSERT INTO seg_perfil (id_perfil, perfil) ");
			sql.append(" VALUES (?,?)");			
			this.jdbcTemplate.update(sql.toString(),id, segPerfil.getPerfil());			
		}
		else
		{
			id = segPerfil.getId_perfil().intValue();
			sql = new StringBuilder();
			sql.append("UPDATE seg_perfil SET perfil = ? ");
			sql.append(" WHERE id_perfil = ? ");			
			
			this.jdbcTemplate.update(sql.toString(), segPerfil.getPerfil(), id);			
			
		}
		return id;
	}
	
	public String validarEliminarProfesion(String cod_profesion)
	{
		String mensaje = "";
		int rows = 0;

		StringBuilder sql = new StringBuilder();
		sql.append("select count(*) ");
		sql.append(" from servicio_civil where cod_profesion = ? ");

		rows = jdbcTemplate.queryForInt(sql.toString(), cod_profesion);
		if (rows > 0)
			mensaje = "Existen personas censadas, asignadas con la profesión, por tanto no puede ser eliminada";
				
		return mensaje;
	}
	
	public String validarEliminarPerfil(Integer idPerfil)
	{
		String mensaje = "";
		int rows = 0;

		StringBuilder sql = new StringBuilder();
		sql.append("select count(*) ");
		sql.append(" from seg_usuario_perfil where id_perfil = ? ");

		rows = jdbcTemplate.queryForInt(sql.toString(), idPerfil);
		if (rows > 0)
			mensaje = "Existen usuarios asignados con el perfil, por tanto no puede ser eliminado";
				
		return mensaje;
	}

	public String validarEliminarGrupoCalificacion(Integer id_grupo_califica)
	{
		String mensaje = "";
		int rows = 0;

		StringBuilder sql = new StringBuilder();
		sql.append("select count(*) ");
		sql.append(" from test_resultado where id_grupo_califica = ? ");
		rows = jdbcTemplate.queryForInt(sql.toString(), id_grupo_califica);
		if (rows > 0)
			mensaje = "Existen resultados de pruebas de diagnóstico, referidas al grupo de calificacion, por tanto no puede ser eliminado";
		
		sql = new StringBuilder();
		sql.append(" ");
		

		sql.append("select count(*) ");
		sql.append(" from exm_califica where id_grupo_califica = ? ");
		rows = jdbcTemplate.queryForInt(sql.toString(), id_grupo_califica);
		if (rows > 0)
			mensaje = "El grupo de calificación esta asignado a la configuración de al menos un perfil de algoritmo, por tanto no puede ser eliminado";
		
		return mensaje;
	}
	
	public String validarEliminarRegimen(String cod_regimen)
	{
		String mensaje = "";
		int rows = 0;

		StringBuilder sql = new StringBuilder();
		sql.append("select count(*) ");
		sql.append(" from servicio_civil where cod_regimen = ? ");

		rows = jdbcTemplate.queryForInt(sql.toString(), cod_regimen);
		if (rows > 0)
			mensaje = "Existen personas censadas, asignadas con el régimen, por tanto no puede ser eliminado";
				
		return mensaje;
	}

	public void eliminarProfesion(String cod_profesion)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM CODIGO ");
		sql.append(" WHERE CODIGO = ? and grupo = 'PROF'");			
		
		this.jdbcTemplate.update(sql.toString(),cod_profesion);			

	}
	
	public void eliminarPerfil(Integer idPerfil)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM SEG_PERFIL_PERMISO ");
		sql.append(" WHERE id_perfil = ? ");			
		this.jdbcTemplate.update(sql.toString(),idPerfil);
		
		sql = new StringBuilder();
		sql.append("DELETE FROM seg_perfil ");
		sql.append(" WHERE id_perfil = ? ");			
		this.jdbcTemplate.update(sql.toString(),idPerfil);
	}

	public void eliminarGrupoCalificacion(Integer id_grupo_califica)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM GRUPO_CALIFICACION ");
		sql.append(" WHERE ID_GRUPO_CALIFICA = ? ");			
		
		this.jdbcTemplate.update(sql.toString(),id_grupo_califica);			

	}

	public void eliminarPermiso(SegPerfilPermiso segPerfilPermiso)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM seg_perfil_permiso ");
		sql.append(" WHERE id_permiso = ? and id_perfil = ? ");			
		
		this.jdbcTemplate.update(sql.toString(),segPerfilPermiso.getId_permiso(), segPerfilPermiso.getId_perfil());			
	}
	
	public void agregarPermiso(SegPerfilPermiso segPerfilPermiso)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("insert into seg_perfil_permiso (id_permiso, id_perfil)");
		sql.append(" values (?,?) ");			
		
		this.jdbcTemplate.update(sql.toString(),segPerfilPermiso.getId_permiso(), segPerfilPermiso.getId_perfil());			
	}

	public void eliminarRegimen(String cod_regimen)
	{
		StringBuilder sql = new StringBuilder();
		sql.append("DELETE FROM CODIGO ");
		sql.append(" WHERE CODIGO = ? and grupo = 'REGI'");			
		
		this.jdbcTemplate.update(sql.toString(),cod_regimen);			

	}
	
	public LinkedList<Restriccion> getRestricciones() {

		LinkedList<Restriccion> list = new LinkedList<Restriccion>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT CODIGO,DESCRIPCION");
		sql.append(" FROM censo.RESTRICCION ORDER BY DESCRIPCION");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString());
		for(Map<String, Object> rec : collec){
			Restriccion obj = new Restriccion();
			obj.setCodigo((String)rec.get("CODIGO"));
			obj.setDescripcion((String)rec.get("DESCRIPCION"));
			list.add(obj);
		}
		return list;	
	}

	public List obtenerUsuarios() {
		List Usuarios = null;
		
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList("select p.dni, p.apellido_paterno || ' ' || p.apellido_materno || ' ' || p.nombres as  nombre, pf.perfil, case when su.estado = '1' then 'ACTIVO' else 'DESHABILITADO' end as estado " +
				" from seg_usuario su, persona p, seg_usuario_perfil sup, seg_perfil pf " +
				" where su.cod_usuario = p.dni and sup.cod_usuario = su.cod_usuario and sup.id_perfil = pf.id_perfil " +
				" order by p.apellido_paterno, p.apellido_materno, p.nombres");
		
		for(Map<String, Object> rec : lEntidadMaps){
			Usuario e = new Usuario();
			e.setDni((String)rec.get("DNI"));
			e.setNombre((String)rec.get("NOMBRE"));
			e.setPerfil((String)rec.get("PERFIL"));
			e.setEstado((String)rec.get("ESTADO"));
			if (Usuarios == null) Usuarios = new ArrayList();
			Usuarios.add(e);
			e = null;
		}
		return Usuarios;
	}
	
	public Usuario  obtenerUsuario(String codUsuario) {
		Usuario obj = null;
		
		String sql = "select su.cod_usuario, su.clave, sup.id_perfil, su.correo, su.estado from seg_usuario su, seg_usuario_perfil sup, seg_perfil pf " +
				" where sup.cod_usuario = su.cod_usuario and sup.id_perfil = pf.id_perfil and su.cod_usuario = '" + codUsuario + "' "; // and id_persona = " + responsable.getId_persona();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql);

		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new Usuario();
			obj.setDni((String) rec.get("COD_USUARIO"));
			obj.setCorreo((String) rec.get("CORREO"));
			obj.setEstado((String) rec.get("ESTADO"));
			obj.setClave((String) rec.get("CLAVE"));
			obj.setId_perfil(((Number)rec.get("ID_PERFIL")).intValue());
		}
		return obj;
	}	
	
	public SegPerfil getSegPerfil(Integer idPerfil) {
		SegPerfil obj = null;
		
		String sql = "select id_perfil, perfil from seg_perfil where id_perfil = ? "; // and id_persona = " + responsable.getId_persona();
		List<Map<String, Object>> lEntidadMaps = jdbcTemplate.queryForList(sql, idPerfil);
		for (Map<String, Object> rec : lEntidadMaps) {
			obj = new SegPerfil();
			obj.setId_perfil((Number) rec.get("ID_PERFIL"));
			obj.setPerfil((String) rec.get("PERFIL"));
		}
		return obj;
	}
	
	public LinkedList<Wserror> getWserrores() {
		LinkedList<Wserror> list = new LinkedList<Wserror>();

		StringBuilder sql = new StringBuilder();
		sql.append("SELECT CODIGO,DESCRIPCION");
		sql.append(" FROM censo.WSERROR ORDER BY DESCRIPCION");

		List<Map<String, Object>> collec = jdbcTemplate.queryForList(sql.toString());
		for(Map<String, Object> rec : collec){
			Wserror obj = new Wserror();
			obj.setCodigo((String)rec.get("CODIGO"));
			obj.setDescripcion((String)rec.get("DESCRIPCION"));
			list.add(obj);
		}
		return list;	
	}

	public void setLogWS(Usuario usuario) {

		StringBuilder sql = new StringBuilder();
		sql.append("INSERT INTO censo.WSLOG (USUARIO, f_ejecucion) ");
		sql.append(" VALUES (?,SYSDATE)");			
		this.jdbcTemplate.update(sql.toString(),usuario.getDni());			
	
	}
	
}
